package es.udc.acs.consorcio.sesion;

import java.util.ArrayList;
import java.util.Formatter;

import es.udc.acs.utils.CodigosFAP;

public class RecibirMensajes extends SesionState {

	@Override
	public String sendMessage(ArrayList<Canal> canales, String question) {
		String subcabecera;
		// random de 0 a tamaño de canales -1
		int index = (int) Math.floor(Math.random()*canales.size());
		Canal canal = canales.get(index);
		if(!canal.estaLibre()){
			index = siguienteLibre(index, canal, canales);
			if(index == -1){
				return CodigosFAP.CE_OTRAS_CAUSAS;
			}
		}
		canal.nuevoMensaje();		
		
        Formatter fmt = new Formatter();        
        fmt.format("%02d",index);
        
        subcabecera = fmt.toString();
        
        fmt = new Formatter();
        fmt.format("%05d",canal.obtenerNumMensaje());

        subcabecera += fmt.toString();
        
		canal.setQuestion(question.substring(0,18)
				          +subcabecera
				          +question.substring(18));

		return subcabecera;
	}
	
	
	/**
	 * Recorre los canales siguientes a index de forma consecutiva, si no encuentra
	 * ninguno libre y llega al final empieza en el 0 hasta volver a index
	 */
	private int siguienteLibre(int index, Canal canal, ArrayList<Canal> canales){
		int i = index;
		i++;
		
		while(i != index){
			canal = canales.get(i);
			if(canal.estaLibre()){
				return i;
			}
			i++;
			if(i == canales.size()-1){
				i = 0;
			}
		}
		
		return -1;
	}


	@Override
	public String receiveMessage(ArrayList<Canal> canales, int canal,
			int respuesta) {
		Canal c = canales.get(canal);
		
		if(c.obtenerNumMensaje() != respuesta){
			return CodigosFAP.CE_MSN_FUERA_SECUENCIA;
		}
		
		if(!c.estaLibre()){
			c.nuevaRespuesta();
		}
		
		if(c.estaLibre()){
			return CodigosFAP.CE_CORRECTO;
		}
		return CodigosFAP.CE_MSN_FUERA_SECUENCIA;
	}


	@Override
	public boolean detenerTrafico(Sesion sesion) {
		return sesion.setState(new TraficoDetenido());
	}


	@Override
	public boolean reanudarTrafico(Sesion sesion) {
		return false;
	}


	@Override
	public boolean cierreSesion(Sesion sesion, ArrayList<Canal> canales,
			String idBanco) {
		return false;
	}


	@Override
	public boolean enRecuperacion(Sesion sesion) {
		return sesion.setState(new EnRecuperacion());
	}


	@Override
	public boolean finRecuperacion(Sesion sesion) {
		return false;
	}


	@Override
	public String obtenerEstado() {
		return "Recibiendo";
	}


	@Override
	public boolean recupera(Sesion sesion, ArrayList<Canal> canales) {
		return false;
	}
}
